package com.gitee.slowcreator.http.annotation;

import com.gitee.slowcreator.http.constant.HttpContentType;
import com.gitee.slowcreator.http.enhance.around.EnhanceAfter;
import com.gitee.slowcreator.http.enhance.around.EnhanceBefore;
import com.gitee.slowcreator.http.enhance.around.EnhanceFail;
import com.gitee.slowcreator.http.enhance.around.simple.SimpleEnhanceAfter;
import com.gitee.slowcreator.http.enhance.around.simple.SimpleEnhanceBefore;
import com.gitee.slowcreator.http.enhance.around.simple.SimpleEnhanceFail;
import com.gitee.slowcreator.http.enums.RequestType;
import com.gitee.slowcreator.http.exception.FailThrowException;

import java.lang.annotation.*;

/**
 * 声明是http请求注解
 *
 * @author zxw
 * @date 2023/1/5 下午9:31
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface HttpClient {

    /**
     * 请求URL
     * 优先级最低的url参数 会被注解或者 ScUnionParams 的 httpUrl 覆盖
     * 避免测试和线上两个环境地址不同
     *
     * @return
     */
    String url();

    /**
     * 请求描述 项目中未使用 说明而已
     *
     * @return
     */
    String desc() default "";

    /**
     * 默认GET请求
     *
     * @return
     */
    RequestType requestType() default RequestType.GET;

    /**
     * 编码
     *
     * @return
     */
    String charset() default "utf-8";

    /**
     * 默认JSON
     *
     * @return
     */
    String contentType() default HttpContentType.JSON;

    /**
     * 请求失败是否抛出异常
     * 默认不抛出
     *
     * @return
     */
    boolean failThrow() default false;

    /**
     * 请求失败抛出的异常
     * 不抛出exception、Throwable这些异常 如果要抛出这些异常可以不设置抛出异常
     * 获取返回值后 根据状态自行抛出
     *
     * @return
     */
    Class<? extends RuntimeException> throwException() default FailThrowException.class;

    /**
     * 是否上传文件请求
     *
     * @return
     */
    boolean isMultipart() default false;

    /**
     * 是否异步调用
     *
     * @return
     */
    boolean isAsync() default false;

    /**
     * 超时时间 默认无超时时间（小于0） 单位毫秒
     *
     * @return
     */
    int timeout() default -1;

    /**
     * 是否下载请求
     *
     * @return
     */
    boolean download() default false;

    /**
     * 是否写本地
     * 下载请求的大文件建议写入本地 防止撑爆内存
     * 建议写入本地可以边下边写
     *
     * @return
     */
    boolean downloadLocal() default false;

    /**
     * 写本地文件的名字
     * 例如：/tmp/slow-creator/text.txt
     *
     * @return
     */
    String downloadLocalFilename() default "";

    /**
     * 增强之前
     *
     * @return
     */
    Class<? extends EnhanceBefore> enhanceBefore() default SimpleEnhanceBefore.class;

    /**
     * 增强之后
     *
     * @return
     */
    Class<? extends EnhanceAfter> enhanceAfter() default SimpleEnhanceAfter.class;

    /**
     * 增强失败
     *
     * @return
     */
    Class<? extends EnhanceFail> enhanceFail() default SimpleEnhanceFail.class;

    /**
     * 重试次数 默认不重试
     * 如果retry为1 如果失败最多执行2次 正常执行一次 retry1次
     * 只会判断status为false或者抛出HttpRetryException的情况 解析错误可以抛出异常 因为正常情况下请求都是成功的 就不在多判断一个解析状态
     *
     * @return
     */
    Retry retry() default @Retry();
}
